<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>直接输入 U+2028 和 U+2029</title>
</head>
<body>
  <script>
    /*
    javascript字符串允许直接输入字符，以及输入字符的转义形式。举例来说， "中" 的Unicode码点是U+4e2d，
    你可以直接在字符串里面输入这个汉字，也可以输入它的转义形式\u4e2d,俩者是等价的
    */
   '中' === '\u4e2d' // true
   // 但是，JavaScript规定有5个字符，不能在字符串里面直接使用，只能使用转义形式。
   /*
   1. u+005c: 反斜杠
   2. u+000d: 回车
   3. u+2028: 行分隔符
   4. u+2029: 段分隔符
   5. u+000a: 换行符


   举例来说，字符串里面不能直接包含反斜杠，一定要转义写成\\或者\u005c。
   这个规定本身没有问题，麻烦在于JSON格式允许字符串里面直接使用u+2028(行分隔符)和u+2029(段分隔符)。
   这样一来，服务器输出的JSON被JSON.parse解析，就有可能直接报错。
   */
  const json = '"\u2028"'
  JSON.parse(json)// 可能报错
  </script>
  <script>
    // 为了消除这个报错，es6允许javascript直接输入U+2028（行分隔符）和 U+2029（段分隔符）
    const PS = eval("'\u2029'")
    /*
    注意，模板字符串现在就允许直接输入这两个字符。
    另外，正则表达式依然不允许直接输入这两个字符，这是没有问题的，
    因为 JSON 本来就不允许直接包含正则表达式。
    */
  </script>
</body>
</html>